#!/bin/bash
#========================================================================
# Author: YSLin
# Email: 
# File Name: function.sh
# Description: 
#   
# Edit History: 
#   2011-04-29    File created.
#========================================================================
##----------------------------------------------------------------------
## 使用command來呼叫原本的內建程式 
## 請注意! 本程式不會有正常結果
##----------------------------------------------------------------------

## 正確的使用範例
cd() {                                # 定義函數cd
    echo "New current directory: $1"
    command cd $1                     # 呼叫內建的cd
}

## 錯誤的使用範例
pwd() {                               # 定義函數pwd
    echo -n "Current directory: "
    #echo "Current directory: \c"     # Solaris的情況
    pwd                   # 呼叫的不是內建的pwd，而是這個函數本身
}                         # 它會一直呼叫自己，直到出現錯誤為止

#cd /
#pwd

##----------------------------------------------------------------------
# 定義函數,與取消定義函數
##----------------------------------------------------------------------
myfunc() {
    echo "Hmm, this function is no longer useful."
}

#unset myfunc  # 將已定義的函數取消
myfunc        # 呼叫(因為已被取消，所以會發生錯誤)  


##----------------------------------------------------------------------
# 傳遞引數給函數                                                                                                               
##----------------------------------------------------------------------

# 函數arg_report會把接收到的引數的總數，以及前面3個引數顯示出來
arg_report() {
    echo "Number of args: $#"
    echo "     First arg: $1"
    echo "    Second arg: $2"
    echo "     Third arg: $3"
}

# 配合各種引數來呼叫看看
arg_report foo 
arg_report foo bar 
arg_report foo bar "baz baz"


##----------------------------------------------------------------------
# 函數的回傳值
##----------------------------------------------------------------------
# 函數dayofweek會把今天星期幾用英文來傳回
dayofweek() {
    LANG=C date +%A 
}

# 函數issunday會在若今天是星期天的話傳回終止碼0(表成功)
# 在其它狀況中傳回1(表失敗)
issunday() {
    if [ `dayofweek` = "Sunday" ]; then
        return 0
    else
        return 1
    fi  
}

# 顯示今天星期幾
dow=`dayofweek`  # 將dayofweek的輸出代入到變數dow中
echo "Today is $dow"

# 若今天是星期天的話，則顯示訊息
# (「&&」會在前面的指令執行成功之後，才去執行後面的指令)
issunday && echo "Have a nice holiday!"                 


##----------------------------------------------------------------------
# 遞迴函數: filecount  統計檔案的個數
##----------------------------------------------------------------------

# 統計出指定的資料夾底下
# 所有的檔案．資料夾的個數，並回報之

do_list() {
    # 這個函數是做遞迴處理(自己呼叫自己)的，所以將變數宣告為區域變數
    local dir count
    dir="$1"
    count=0

    #對於使用「${dir}/*」之後顯示出來的所有檔案．資料夾做同樣的處理
    for fn in ${dir}/*; do
    if [ -d "$fn" ]; then   #若是資料夾的話，做遞迴呼叫
        do_list "${fn}"
    fi  
    count=`expr $count + 1` #統計檔案的個數
    done
    echo "${count} ${dir}"
}

do_list $1

